import datetime
import json
import re
import shutil
import tempfile
import urllib.parse

import requests
from flask import Flask, render_template, request, session, send_file, make_response
import os
import uuid
from LRU_cache import LRUCache
from log_util import init_logger
import threading
import pickle
import asyncio
import yaml


DATA_DIR = "data"
logger = init_logger(file_name=os.path.join(DATA_DIR, "running.log"), stdout=True)

with open(os.path.join(DATA_DIR, "config.yaml"), "r", encoding="utf-8") as f:
    config = yaml.load(f, Loader=yaml.FullLoader)
    if 'HTTPS_PROXY' in config:
        if os.environ.get('HTTPS_PROXY') is None:  # 优先使用环境变量中的代理，若环境变量中没有代理，则使用配置文件中的代理
            os.environ['HTTPS_PROXY'] = config['HTTPS_PROXY']
    if 'PASSWORD' in config:
        PASSWORD = config['PASSWORD']
    else:
        PASSWORD = ""  # 即不使用访问密码
    if 'ADMIN_PASSWORD' in config:
        ADMIN_PASSWORD = config['ADMIN_PASSWORD']
    else:
        ADMIN_PASSWORD = ""
    PORT = config['PORT']
    API_KEY = config['OPENAI_API_KEY']
    API_BASE = config['OPENAI_API_BASE']
    CHAT_CONTEXT_NUMBER_MAX = config[
        'CHAT_CONTEXT_NUMBER_MAX']  # 连续对话模式下的上下文最大数量 n，即开启连续对话模式后，将上传本条消息以及之前你和GPT对话的n-1条消息
    USER_SAVE_MAX = config['USER_SAVE_MAX']  # 设置最多存储n个用户，当用户过多时可适当调大

if os.getenv("DEPLOY_ON_RAILWAY") is not None or os.getenv("DEPLOY_ON_ZEABUR"):  # 如果是云部署，需要删除代理
    os.environ.pop('HTTPS_PROXY', None)

API_KEY = os.getenv("OPENAI_API_KEY", default=API_KEY)  # 如果环境变量中设置了OPENAI_API_KEY，则使用环境变量中的OPENAI_API_KEY
API_BASE = os.getenv("OPENAI_API_BASE", default=API_BASE)  # 如果环境变量中设置了OPENAI_API_KEY，则使用环境变量中的OPENAI_API_KEY
PORT = os.getenv("PORT", default=PORT)  # 如果环境变量中设置了PORT，则使用环境变量中的PORT
PASSWORD = os.getenv("PASSWORD", default=PASSWORD)  # 如果环境变量中设置了PASSWORD，则使用环境变量中的PASSWORD
ADMIN_PASSWORD = os.getenv("ADMIN_PASSWORD", default=ADMIN_PASSWORD)  # 如果环境变量中设置了ADMIN_PASSWORD，则使用环境变量中的ADMIN_PASSWORD
if ADMIN_PASSWORD == "":
    ADMIN_PASSWORD = PASSWORD  # 如果ADMIN_PASSWORD为空，则使用PASSWORD

STREAM_FLAG = False  # 是否开启流式推送
USER_DICT_FILE = "all_user_dict_v3.pkl"  # 用户信息存储文件（包含版本）
lock = threading.Lock()  # 用于线程锁
game_lock = threading.Lock() #创建赛事
project_info = "## ChatGPT 网页版    \n" \
               " Code From  " \
               "[ChatGPT-Web](https://github.com/LiangYang666/ChatGPT-Web)  \n" \
               "发送`帮助`可获取帮助  \n"
# 适配python3.6
loop = asyncio.get_event_loop()

def asyncio_run(func):
    loop.run_until_complete(func)
